import BMF from 'browser-md5-file'

/**
 * 获取文件的 MD5 值
 * 依赖库：pnpm i browser-md5-file
 * 需要的导入：import BMF from 'browser-md5-file'
 * 代码参考自：https://blog.csdn.net/bbs11007/article/details/117930352
 *
 * @param file 需要获取 MD5 值的文件
 * @return {Promise<unknown>} 成功状态：获取 MD5 成功；失败状态：发生错误
 */
export function getFileMD5(file) {
    // 创建计算文件文件 MD5 值的对象
    const bmf = new BMF()
    return new Promise((resolve, reject) => {
        // 获取文件的 MD5
        bmf.md5(file, (error, md5) => {
            // 发生错误
            if (error) reject(error)
            // 获取文件的 MD5 成功
            resolve(md5)
        })
    })
}

/**
 * 文件分片，每片的最大大小，单位字节
 *
 * @type {number}
 */
const fileSliceSize = 1024 * 1024 * 2

/**
 * 对指定的文件进行分片
 *
 * @param file 需要进行分片的文件
 * @param sliceSize 文件分片每片的大小
 * @return {Promise<unknown>} 文件分片组成的数组
 */
export function fileSlice(file, sliceSize = fileSliceSize) {
    // 返回文件分片数组
    return new Promise((resolve, reject) => {
        if (file === null || file === undefined || !(file instanceof File)) {
            reject("file 不为文件对象")
        }
        // 获取文件的大小
        const fileSize = file.size
        // 计算文件分片个数
        const sliceCnt = Math.ceil(fileSize * 1.0 / sliceSize)
        // 存储所有的文件分片
        const fileSlices = []
        // 文件分片
        for (let i = 0; i < sliceCnt; i++) {
            // 计算当前分片开始位置的偏移量
            let offSet = sliceSize * i
            // 获取当前文件分片
            fileSlices.push(file.slice(offSet, offSet + sliceSize))
        }
        // 调用成功处理函数，传递文件分片数组
        resolve(fileSlices)
    });
}

// 存放计时器的字段名
export const INTERVAL_FIELD_NAME = 'interval'

/**
 * 改变文件上传进度百分比
 *
 * @param file 组件库封装的上传文件对象
 * @param percentageFieldName 组件库封装的上传文件对象中上传进度百分比字段名
 */
export const addPercentageInterval = (file, percentageFieldName = INTERVAL_FIELD_NAME) => {
    // 开启并保存计时器
    file[percentageFieldName] = setInterval(() => {
        if (file.percentage < 50) {
            file.percentage += 1
        } else if (file.percentage < 75) {
            file.percentage += 0.5
        } else if (file.percentage < 90) {
            file.percentage += 0.1
        }
        if (file.percentage >= 99) {
            // 清除计时器
            clearInterval(file[percentageFieldName])
        }
    }, 100)
}